﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using DataEntity;

namespace Contract.Data.Manager
{
    //Criado por : Gustavo
    //Data       : 4/9/2012 8:11:45 PM
    public class DMSaidaChegada : DMGeneric<BESaidaChegada, FESaidaChegada>
    {
        databaseDataContext dc;

        #region Override

        public override BESaidaChegada Salvar(BESaidaChegada entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {
                    var q = from p in dc.DESaidaChegadas
                            where
                                p.CodigoVenda == entidade.CodigoVenda
                            select p;

                    if (q.ToList().Count > 0)
                        Alterar(entidade);
                    else
                        Incluir(entidade);
                }

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BESaidaChegada entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from r in dc.DESaidaChegadas
                            where
                                r.CodigoVenda == entidade.CodigoVenda
                            select r;

                    DESaidaChegada de = q.First();

                    dc.DESaidaChegadas.DeleteOnSubmit(de);

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BESaidaChegada ObterEntidade(int codigo)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESaidaChegadas
                            where
                                e.CodigoVenda == codigo
                            select e;

                    return q.First().ConvertToBE(1);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BESaidaChegada> ObterTodos(FESaidaChegada filter)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESaidaChegadas
                            where
                            (
                                (((filter.CodigoVenda != null)
                                && (e.CodigoVenda == filter.CodigoVenda)) || (filter.CodigoVenda == null)) &&

                                (((filter.CodigoMotoboy != null)
                                && (e.CodigoMotoboy == filter.CodigoMotoboy)) || (filter.CodigoMotoboy == null)) &&

                                (((filter.HoraSaida != null)
                                && (e.HoraSaida.Contains(filter.HoraSaida))) || (filter.HoraSaida == null)) &&

                                (((filter.HoraChegada != null)
                                && (e.HoraChegada.Contains(filter.HoraChegada))) || (filter.HoraChegada == null))
                            )
                            select e;

                    List<DESaidaChegada> deSaidaChegada = q.ToList();

                    List<BESaidaChegada> retorno = new List<BESaidaChegada>();

                    foreach (DESaidaChegada de in deSaidaChegada)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        private int Incluir(BESaidaChegada entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    DESaidaChegada de = new DESaidaChegada();
                    de.ConvertFromBE(entidade);

                    dc.DESaidaChegadas.InsertOnSubmit(de);

                    dc.SubmitChanges();

                    return de.CodigoVenda;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BESaidaChegada entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESaidaChegadas
                            where e.CodigoVenda == entidade.CodigoVenda
                            select e;

                    DESaidaChegada de = q.First();

                    de.CodigoVenda = entidade.CodigoVenda;
                    de.CodigoMotoboy = entidade.CodigoMotoboy;
                    de.HoraSaida = entidade.HoraSaida;
                    de.HoraChegada = entidade.HoraChegada;

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public List<BESaidaChegada> ObterTodosEmAberto(int codigoMotoboy)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESaidaChegadas
                            where (e.HoraSaida == null || e.HoraChegada == null) &&
                                  ((e.CodigoMotoboy == null || e.CodigoMotoboy.Equals(codigoMotoboy)) || (codigoMotoboy == 0 && e.HoraSaida == null && e.HoraChegada == null)) &&
                                  e.DEVenda.DataVenda >= DateTime.Today
                            select e;

                    List<DESaidaChegada> deSaidaChegada = q.ToList();

                    List<BESaidaChegada> retorno = new List<BESaidaChegada>();

                    foreach (DESaidaChegada de in deSaidaChegada)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion
    }
}
